package com.karson.service.service.impl;

import com.karson.common.dto.rabbitmq.StaticMessage;
import com.karson.service.service.IStatisticService;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.LongAdder;

/**
 * 抽象基类，抽取逻辑公共部分，将逻辑不同的交由子类实现
 * @author ZKS
 */
public abstract class AbstractStatisticService implements IStatisticService {

    /**
     * 本地聚合增量数据
     */
    protected final ConcurrentHashMap<StaticMessage, LongAdder> countMap = new ConcurrentHashMap<>();

    /**
     * 增加或减少计数
     *
     * @param id         实体ID
     * @param delta      正数增加，负数减少
     * @param entityType 类型
     */
    @Override
    public void changeCount(Integer id, Integer delta, String entityType) {
        StaticMessage key = new StaticMessage(id,entityType);
        countMap.computeIfAbsent(key, k -> new LongAdder()).add(delta);
    }

    /**
     * 批量刷数据库
     */
    @Override
    public void flushToDatabase() {
        for (Map.Entry<StaticMessage, LongAdder> entry : countMap.entrySet()) {
            StaticMessage key = entry.getKey();
            long count = entry.getValue().sum();

            // 调用子类实现的数据库写入逻辑
            flushToDatabase(key, count);
        }
        countMap.clear();
    }

    /**
     * 子类实现具体数据库增量逻辑
     * @param key 消息实体
     * @param count 聚合总数（增量）
     */
    protected abstract void flushToDatabase(StaticMessage key, long count);
}